/**
 * Created by zhangguoyu on 16/5/10.
 */

var Utils = require('../../utils/Utils');
var Stat = require('./Stat');
var AppStat = require('./AppStat');
var CategoryStat = require('./CategoryStat');
var ContentStat = require('./ContentStat');

/**
 * 统计是数据组合
 * 包括总共的统计数据, 产品应用的统计数据, 栏目的统计数据, 节目的统计数据
 * @constructor
 */
var StatSet = function () {
  this._global = new Stat();  // 总共的
  this._apps = [];  // 产品的
  this._categories = [];  // 栏目的
  this._contents = [];  // 节目的

  var self = this;
  this._findOneOrInsert = function (arr, equalFunc, createFunc) {
    // 从arr中查找指定的item,如果item不存在,则根据createFunc创建一个新的item,并放到arr中
    var i = arr.length;
    var tag = undefined;
    var args = Utils.toArray(arguments).slice(3);
    while (i--) {
      var item = arr[i];
      if (equalFunc.apply(self, [item].concat(args))) {
        tag = item;
        break;
      }
    }
    if (tag === undefined) {
      tag = createFunc.apply(self, args);
      arr.push(tag);
    }
    return tag;
  }
};

/**
 * 获取总共的统计数据对象
 * @returns {Stat}
 */
StatSet.prototype.global = function () {
  return this._global;
};

/**
 * 获取产品应用的统计数据对象
 * @param code 产品应用id
 */
StatSet.prototype.app = function (code) {
  return this._findOneOrInsert(this._apps, function (item, code) {
    return item.code() === code;
  }, function (code) {
    return new AppStat(code);
  }, code);
};

/**
 * 获取栏目的统计数据对象
 * @param code 栏目id
 * @param app 产品应用id
 */
StatSet.prototype.category = function (code, app) {
  return this._findOneOrInsert(this._categories, function (item, code, app) {
    return item.code() === code;
  }, function (code, app) {
    return new CategoryStat(code, app);
  }, code, app);
};

/**
 * 获取节目的统计数据对象
 * @param code 节目id
 * @param app 产品应用id
 */
StatSet.prototype.content = function (code, app) {
  return this._findOneOrInsert(this._contents, function (item, code, app) {
    return item.code() === code;
  }, function (code, app) {
    return new ContentStat(code, app);
  }, code, app);
};

module.exports = StatSet;
